from django.http import JsonResponse  # 导入JsonResponse用于返回JSON格式的HTTP响应
from django.views import View  # 导入View基类用于创建视图
from django.views.decorators.csrf import csrf_exempt  # 导入csrf_exempt用于禁用CSRF保护
from django.utils.decorators import method_decorator  # 导入method_decorator用于装饰类方法
from .models import Category, Question, Answer  # 导入Category、Question和Answer模型
from account.models import CustomUser  # 导入CustomUser模型
import json  # 导入json模块用于解析JSON数据

@method_decorator(csrf_exempt, name='dispatch')  # 使用csrf_exempt装饰器禁用CSRF保护
class ViewsUpdateView(View):  # 新增专门用于更新浏览量的视图类
    def put(self, request, *args, **kwargs):  # 定义处理PUT请求的方法
        data = json.loads(request.body)  # 获取PUT请求中的JSON数据
        question_id = data.get('question_id')  # 获取question_id字段

        if not question_id:  # 检查question_id是否存在
            return JsonResponse({'message': '需要问题ID', 'data': None, 'code': 400}, status=200)  # 返回错误信息

        try:
            question = Question.objects.get(id=question_id)  # 获取问题
            question.views += 1  # 浏览量加1
            question.save()  # 保存问题
            return JsonResponse({'message': '浏览量更新成功', 'data': None, 'code': 200}, status=200)  # 返回成功信息
        except Question.DoesNotExist:
            return JsonResponse({'message': '问题未找到', 'data': None, 'code': 404}, status=200)  # 返回错误信息

@method_decorator(csrf_exempt, name='dispatch')  # 使用csrf_exempt装饰器禁用CSRF保护
class CategoryView(View):  # 定义分类视图类
    def get(self, request, *args, **kwargs):  # 定义处理GET请求的方法
        categories = Category.objects.all()  # 获取所有分类
        data = [{'id': category.id, 'name': category.name, 'color': category.color} for category in categories]  # 构建分类数据列表
        return JsonResponse({'message': '分类获取成功', 'data': data, 'code': 200}, status=200)  # 返回成功信息和分类数据

    def post(self, request, *args, **kwargs):  # 定义处理POST请求的方法
        data = json.loads(request.body)  # 获取POST请求中的JSON数据
        name = data.get('name')  # 获取name字段
        color = data.get('color')  # 获取color字段

        if not name or not color:  # 检查是否有字段缺失
            return JsonResponse({'message': '缺少字段', 'data': None, 'code': 400}, status=200)  # 返回错误信息

        category = Category.objects.create(name=name, color=color)  # 创建新分类
        return JsonResponse({'message': '分类创建成功', 'data': {'id': category.id}, 'code': 201}, status=200)  # 返回成功信息和新分类的ID

@method_decorator(csrf_exempt, name='dispatch')  # 使用csrf_exempt装饰器禁用CSRF保护
class QuestionView(View):  # 定义问题视图类
    def get(self, request, *args, **kwargs):  # 定义处理GET请求的方法
        questions = Question.objects.all()  # 获取所有问题
        data = [{
            'id': question.id,
            'title': question.title,
            'content': question.content,
            'created_at': question.created_at.isoformat(),
            'updated_at': question.updated_at.isoformat(),
            'pinned': question.pinned,
            'views': question.views,
            'category': {
                'id': question.category.id,
                'name': question.category.name,
                'color': question.category.color
            },
            'author': {
                'id': question.author.id,
                'username': question.author.username
            },
            'best_answer': {
                'id': question.best_answer.id,
                'content': question.best_answer.content
            } if question.best_answer else None
        } for question in questions]  # 构建问题数据列表，包括最佳答案详细信息
        return JsonResponse({'message': '问题获取成功', 'data': data, 'code': 200}, status=200)  # 返回成功信息和问题数据

    def post(self, request, *args, **kwargs):  # 定义处理POST请求的方法
        data = json.loads(request.body)  # 获取POST请求中的JSON数据
        title = data.get('title')  # 获取title字段
        content = data.get('content')  # 获取content字段
        category_id = data.get('category_id')  # 获取category_id字段
        author_id = data.get('author_id')  # 获取author_id字段

        if not title or not content or not category_id or not author_id:  # 检查是否有字段缺失
            return JsonResponse({'message': '缺少字段', 'data': None, 'code': 400}, status=200)  # 返回错误信息

        try:
            category = Category.objects.get(id=category_id)  # 获取分类
            author = CustomUser.objects.get(id=author_id)  # 获取作者
            question = Question.objects.create(title=title, content=content, category=category, author=author)  # 创建新问题
            return JsonResponse({'message': '问题创建成功', 'data': {'id': question.id}, 'code': 201}, status=200)  # 返回成功信息和新问题的ID
        except Category.DoesNotExist:
            return JsonResponse({'message': '分类未找到', 'data': None, 'code': 404}, status=200)  # 返回错误信息
        except CustomUser.DoesNotExist:
            return JsonResponse({'message': '用户未找到', 'data': None, 'code': 404}, status=200)  # 返回错误信息

@method_decorator(csrf_exempt, name='dispatch')  # 使用csrf_exempt装饰器禁用CSRF保护
class AnswerView(View):  # 定义答案视图类
    def get(self, request, *args, **kwargs):  # 定义处理GET请求的方法
        question_id = request.GET.get('question_id')  # 获取question_id字段
        if not question_id:  # 检查question_id是否存在
            return JsonResponse({'message': '需要问题ID', 'data': None, 'code': 400}, status=200)  # 返回错误信息

        answers = Answer.objects.filter(question_id=question_id)  # 获取指定问题的所有答案
        data = [{'id': answer.id, 'content': answer.content, 'created_at': answer.created_at, 'updated_at': answer.updated_at, 'author': answer.author.username} for answer in answers]  # 构建答案数据列表
        return JsonResponse({'message': '答案获取成功', 'data': data, 'code': 200}, status=200)  # 返回成功信息和答案数据

    def post(self, request, *args, **kwargs):  # 定义处理POST请求的方法
        data = json.loads(request.body)  # 获取POST请求中的JSON数据
        question_id = data.get('question_id')  # 获取question_id字段
        content = data.get('content')  # 获取content字段
        author_id = data.get('author_id')  # 获取author_id字段

        if not question_id or not content or not author_id:  # 检查是否有字段缺失
            return JsonResponse({'message': '缺少字段', 'data': None, 'code': 400}, status=200)  # 返回错误信息

        try:
            question = Question.objects.get(id=question_id)  # 获取问题
            author = CustomUser.objects.get(id=author_id)  # 获取作者
            answer = Answer.objects.create(question=question, content=content, author=author)  # 创建新答案
            return JsonResponse({'message': '答案创建成功', 'data': {'id': answer.id}, 'code': 201}, status=200)  # 返回成功信息和新答案的ID
        except Question.DoesNotExist:
            return JsonResponse({'message': '问题未找到', 'data': None, 'code': 404}, status=200)  # 返回错误信息
        except CustomUser.DoesNotExist:
            return JsonResponse({'message': '用户未找到', 'data': None, 'code': 404}, status=200)  # 返回错误信息

    def put(self, request, *args, **kwargs):  # 定义处理PUT请求的方法
        data = json.loads(request.body)  # 获取PUT请求中的JSON数据
        answer_id = data.get('answer_id')  # 获取answer_id字段

        if not answer_id:  # 检查answer_id是否存在
            return JsonResponse({'message': '需要答案ID', 'data': None, 'code': 400}, status=200)  # 返回错误信息

        try:
            answer = Answer.objects.get(id=answer_id)  # 获取答案
            question = answer.question  # 获取答案所属的问题
            question.best_answer = answer  # 将答案设置为问题的最佳答案
            question.save()  # 保存问题
            return JsonResponse({'message': '采纳答案成功', 'data': None, 'code': 200}, status=200)  # 返回成功信息
        except Answer.DoesNotExist:
            return JsonResponse({'message': '答案未找到', 'data': None, 'code': 404}, status=200)  # 返回错误信息

@method_decorator(csrf_exempt, name='dispatch')  # 使用csrf_exempt装饰器禁用CSRF保护
class QuestionDetailView(View):  # 定义问题详情视图类
    def get(self, request, *args, **kwargs):  # 定义处理GET请求的方法
        question_id = request.GET.get('question_id')  # 获取question_id字段
        if not question_id:  # 检查question_id是否存在
            return JsonResponse({'message': '需要问题ID', 'data': None, 'code': 400}, status=200)  # 返回错误信息

        try:
            question = Question.objects.get(id=question_id)  # 获取指定问题
            data = {
                'id': question.id,
                'title': question.title,
                'content': question.content,
                'created_at': question.created_at.isoformat(),
                'updated_at': question.updated_at.isoformat(),
                'pinned': question.pinned,
                'views': question.views,
                'category': {
                    'id': question.category.id,
                    'name': question.category.name,
                    'color': question.category.color
                },
                'author': {
                    'id': question.author.id,
                    'username': question.author.username
                },
                'best_answer': {
                    'id': question.best_answer.id,
                    'content': question.best_answer.content
                } if question.best_answer else None
            }
            return JsonResponse({'message': '问题详情获取成功', 'data': data, 'code': 200}, status=200)  # 返回成功信息和问题详情
        except Question.DoesNotExist:
            return JsonResponse({'message': '问题未找到', 'data': None, 'code': 404}, status=200)  # 返回错误信息

    def put(self, request, *args, **kwargs):  # 定义处理PUT请求的方法
        data = json.loads(request.body)  # 获取PUT请求中的JSON数据
        question_id = data.get('question_id')  # 获取question_id字段
        title = data.get('title')  # 获取title字段
        content = data.get('content')  # 获取content字段
        category_id = data.get('category_id')  # 获取category_id字段

        if not question_id:  # 检查question_id是否存在
            return JsonResponse({'message': '需要问题ID', 'data': None, 'code': 400}, status=200)  # 返回错误信息

        try:
            question = Question.objects.get(id=question_id)  # 获取问题
            if title:
                question.title = title  # 更新标题
            if content:
                question.content = content  # 更新内容
            if category_id:
                category = Category.objects.get(id=category_id)  # 获取分类
                question.category = category  # 更新分类
            question.save()  # 保存问题
            return JsonResponse({'message': '问题更新成功', 'data': None, 'code': 200}, status=200)  # 返回成功信息
        except Question.DoesNotExist:
            return JsonResponse({'message': '问题未找到', 'data': None, 'code': 404}, status=200)  # 返回错误信息
        except Category.DoesNotExist:
            return JsonResponse({'message': '分类未找到', 'data': None, 'code': 404}, status=200)  # 返回错误信息

    def delete(self, request, *args, **kwargs):  # 定义处理DELETE请求的方法
        data = json.loads(request.body)  # 获取DELETE请求中的JSON数据
        question_id = data.get('question_id')  # 获取question_id字段

        if not question_id:  # 检查question_id是否存在
            return JsonResponse({'message': '需要问题ID', 'data': None, 'code': 400}, status=200)  # 返回错误信息

        try:
            question = Question.objects.get(id=question_id)  # 获取问题
            question.delete()  # 删除问题
            return JsonResponse({'message': '问题删除成功', 'data': None, 'code': 200}, status=200)  # 返回成功信息
        except Question.DoesNotExist:
            return JsonResponse({'message': '问题未找到', 'data': None, 'code': 404}, status=200)  # 返回错误信息
